package mysql8学习.高级.第18章_主从复制;

/**
 * 4.4 如何解决一致性问题
 * 方法1:异步复制
 *    异步模式就是客户端提交 COMMIT 之后不需要等从库返回任何结果，而是直接将结果返回给客户端，
 *    这样做的好处是不会影响主库写的效率，但可能会存在主库宕机，
 *    而Binlog还没有同步到从库的情况,也就是此时的主库和从库数据不一致。
 *    这时候从从库中选择一个作为新主, 那么新主则可能缺少原来主服务器中已提交的事务。
 *    所以,这种复制模式下的数据一致性是最弱的。
 *
 * 方法2:半同步复制
 *    MySQL5.5版本之后开始支持半同步复制的方式。
 *    原理是在客户端提交 COMMIT 之后不直接将结果返回给客户端，
 *    而是等待至少有一个从库接收到了Binlog,并且写入到中继日志中，再返回给客户端。
 *    这样做的好处就是提高了数据的一致性，当然相比于异步复制来说，至少多增加了一个网络连接的延迟，
 *    降低了主库写的效率。
 *    在MySQL5.7版本中还增加了一个rpl_semi_sync_master_wait_for_slave_count参数,
 *    可以对应答的从库数量进行设置，默认为1,也就是说只要有1个从库进行了响应，就可以返回给客户端。
 *    如果将这个参数调大，可以提升数据一致性的强度， 但也会增加主库等待从库响应的时间。
 *
 * 方法3:组复制
 *    异步复制和半同步复制都无法最终保证数据的一致性问题，
 *    半同步复制是通过判断从库响应的个数来决定是否返回给客户端，
 *    虽然数据一致性相比于异步复制有提升,但仍然无法满足对数据一致性要求高的场景，
 *    比如金融领域。MGR很好地弥补了这两种复制模式的不足.
 *    组复制技术，简称MGR (MySQL Group Replication)。
 *    是MySQL在5.7.17版本中推出的一种新的数据复制技术，这种复制技术是基于Paxos协议的状态机复制。
 *
 * MGR是如何工作的
 *    首先我们将多个节点共同组成一个复制组，在执行读写(RW) 事务的时候，
 *    需要通过一致性协议层(Consensus层)的同意,
 *    也就是读写事务想要进行提交,必须要经过组里"大多数人”(对应Node节点)的同意，
 *    大多数指的是同意的节点数星需要大于(N/2+1)，这样才可以进行提交，而不是原发起方一个说了算。
 *    而针对只读(RO)事务则不需要经过组内同意，直接COMMIT即可。
 *
 *    在一个复制组内有多个节点组成，它们各自维护了自己的数据副本,
 *    并且在一致性协议层实现了原子消息和全局有序消息，从而保证组内数据的一致性。
 *    MGR将MySQL带入了数据强一致性的时代，是一个划时代的创新，其中一个重要的原因就是MGR是基于Paxos协议的。
 *    Paxos 算法是由2013年的图灵奖获得者Leslie Lamport于1990年提出的，
 *    有关这个算法的决策机制可以搜一下。
 *    事实上，Paxos算法提出来之后就作为分布式一致性算法 被广泛应用，
 *    比如Apache的ZooKeeper也是基于Paxos实现的。
 *
 */
public class D4_如何解决一致性问题 {
}
